import { defineConfig } from 'vite'
import { babel } from '@rollup/plugin-babel'
import compression from 'vite-plugin-compression'

export default defineConfig({
  build: {
    target: 'es2015', // 配合 preset-env 做基础降级
    // 生成更小的内联代码
    minify: 'terser',
    terserOptions: {
      format: {
        comments: false // 移除注释
      }
    },
    rollupOptions: {
      output: {
        // 所有代码合并到一个文件
        inlineDynamicImports: true, // 防止生成额外 chunk
        entryFileNames: 'bundle.js' // 输出文件名
      }
    }
  },
  plugins: [
    babel({
      exclude: 'node_modules/**',
      babelHelpers: 'runtime'
    }),
    {
      name: 'inline-single-js-to-html',
      enforce: 'post', // 在 Vite 处理 HTML 之后执行
      generateBundle(_, bundle) {
        const htmlFile = Object.keys(bundle).find((file) => file.endsWith('.html'))
        const jsFile = Object.keys(bundle).find((file) => file.endsWith('.js'))

        console.log('status', htmlFile, jsFile)

        if (!htmlFile || !jsFile) return

        const htmlChunk = bundle[htmlFile]
        const jsChunk = bundle[jsFile]

        // 删除 HTML 中原本的 <script src="...">
        htmlChunk.source = htmlChunk.source.replace(new RegExp(`<script[^>]*src="[^"]*${jsFile}"[^>]*></script>`), '')

        // 在 </body> 前插入内联 JS
        htmlChunk.source = htmlChunk.source.replace(
          /<\/html>/i,
          `<script type="module">\n${jsChunk.code}\n</script>\n</html>`
        )

        // 删除独立的 JS 文件
        delete bundle[jsFile]
      }
    },
    compression({
      verbose: true, // 打印压缩结果
      disable: false, // 是否禁用插件
      threshold: 10240, // 只有大于 10kb 的文件才压缩
      algorithm: 'gzip', // 压缩算法 gzip、brotliCompress、deflate 等
      ext: '.gz' // 生成文件后缀
    })
  ]
})
